package com.tomcat.mesos.master;

import org.apache.mesos.Protos;
import org.apache.mesos.SchedulerDriver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collection;

/**
 *  调度器驱动
 *
 *      负责调用框架调度器的回调函数
 *
 * @author Rayn on 2015/12/22 11:17
 * @email liuwei412552703@163.com
 */
public class MesosSchedulerDriver implements SchedulerDriver
{
    private static final Logger LOG = LoggerFactory.getLogger(MesosSchedulerDriver.class);

    /**
     * 方法启动调度器，必须在其他方法被调用前执行
     *
     * @return
     */
    @Override
    public Protos.Status start()
    {
        LOG.info("方法启动调度器。");




        return null;
    }

    /**
     * 用来停止一个驱动，failover 标志位用来表明框架是否设置了故障恢复
     *      false : 框架不会和 Mesos 重新连接， mesoso 会注销该框架并杀死该框架下所有运行的执行器和任务。
     *      true  : mesos 会继续运行执行器和任务。并允许驱动重新和他们连接连接
     *
     * @param failover
     * @return
     */
    @Override
    public Protos.Status stop(boolean failover)
    {
        return null;
    }

    /**
     * 和上面等价
     * @return
     */
    @Override
    public Protos.Status stop()
    {
        return null;
    }

    /**
     * 该方法会终止 driver ，并停止所有发送给调度器的回调（开启故障恢复）将会启动一个新的driver 实例
     *
     * @return
     */
    @Override
    public Protos.Status abort()
    {


        return null;
    }

    /**
     * 等到驱动推出（stop或abort)并有可能一直阻塞下去。通过它的返回状态可以找到驱动是正常退出还是异常退出
     *
     * @return
     */
    @Override
    public Protos.Status join()
    {
        return null;
    }

    /**
     * 该方法依次执行 start join 的一个便利方法
     * @return
     */
    @Override
    public Protos.Status run()
    {


        return null;
    }

    /**
     * 向 master 申请资源，并将资源提供给资源框架调度器
     *
     * @param requests
     * @return
     */
    @Override
    public Protos.Status requestResources(Collection<Protos.Request> requests)
    {
        return null;
    }

    /**
     * 在一组资源 offer 上启动一组人物，没有被执行器和人物所使用的资源 offer 视为拒绝。如果有过滤器的存在，过滤器将在剩余资源上执行过滤
     * @param offerIds
     * @param tasks
     * @param filters
     * @return
     */
    @Override
    public Protos.Status launchTasks(Collection<Protos.OfferID> offerIds, Collection<Protos.TaskInfo> tasks, Protos.Filters filters)
    {
        return null;
    }

    /**
     * 同上
     * @param offerIds
     * @param tasks
     * @return
     */
    @Override
    public Protos.Status launchTasks(Collection<Protos.OfferID> offerIds, Collection<Protos.TaskInfo> tasks)
    {
        return null;
    }

    /**
     * 同上
     * @param offerId
     * @param tasks
     * @param filters
     * @return
     */
    @Override
    public Protos.Status launchTasks(Protos.OfferID offerId, Collection<Protos.TaskInfo> tasks, Protos.Filters filters)
    {
        return null;
    }

    /**
     * 同上
     * @param offerId
     * @param tasks
     * @return
     */
    @Override
    public Protos.Status launchTasks(Protos.OfferID offerId, Collection<Protos.TaskInfo> tasks)
    {
        return null;
    }

    @Override
    public Protos.Status killTask(Protos.TaskID taskId)
    {
        return null;
    }

    @Override
    public Protos.Status acceptOffers(Collection<Protos.OfferID> offerIds, Collection<Protos.Offer.Operation> operations, Protos.Filters filters)
    {
        return null;
    }

    /**
     * 拒绝某个 offer 的资源，如 Filter 存在，则他也会被使用
     *
     * @param offerId
     * @param filters
     * @return
     */
    @Override
    public Protos.Status declineOffer(Protos.OfferID offerId, Protos.Filters filters)
    {
        return null;
    }

    /**
     * 拒绝某个 offer 的资源
     * @param offerId
     * @return
     */
    @Override
    public Protos.Status declineOffer(Protos.OfferID offerId)
    {
        return null;
    }

    /**
     * 删除之前设置的过滤器，使得框架可以从之前被过滤的 slave 中接受资源 offer
     * @return
     */
    @Override
    public Protos.Status reviveOffers()
    {
        return null;
    }

    /**
     *
     * @return
     */
    @Override
    public Protos.Status suppressOffers()
    {
        return null;
    }

    /**
     *
     * @param status
     * @return
     */
    @Override
    public Protos.Status acknowledgeStatusUpdate(Protos.TaskStatus status)
    {
        return null;
    }

    /**
     * 从框架向执行器发送消息，消息传输采用基于最大努力交付服务，消息传输失败时并不会重新传输
     *
     * @param executorId
     * @param slaveId
     * @param data
     * @return
     */
    @Override
    public Protos.Status sendFrameworkMessage(Protos.ExecutorID executorId, Protos.SlaveID slaveId, byte[] data)
    {
        return null;
    }

    /**
     * master 会针对参数中所指定的任务将其上次接收到的任务状态送回，如果参数没有指定任务，master 会发送其知道的所有非种植态的任务状态。
     *
     * 可以使用这个方法来搜索任务状态，那么没有被发现的任务会被更新为 task lost 状态。
      * @param statuses
     * @return
     */
    @Override
    public Protos.Status reconcileTasks(Collection<Protos.TaskStatus> statuses)
    {
        return null;
    }
}
